package com.aftersale.demo.utils;

import cn.hutool.core.io.FileUtil;
import com.aftersale.demo.entity.DbLog;
import com.aftersale.demo.entity.LogType;
import com.aftersale.demo.entity.Problem;
import com.aftersale.demo.entity.Result;

import com.aftersale.demo.mapper.ProblemMapper;
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.CredentialsProviderFactory;
import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
import com.aliyun.oss.model.GetObjectRequest;
import com.aliyun.oss.model.ObjectMetadata;
import com.aliyun.oss.model.UploadFileRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.http.MediaType;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.Objects;
import java.util.UUID;


/**
 * @author 空
 * @date 2023/11/6 22:23
 * @desc
 */



public class FileUpload {

    @Autowired
    ProblemMapper problemMapper;

    @DbLog(operation = "文件",type = LogType.ADD)
    public static String upload(MultipartFile file) {

        if(file.isEmpty()||Objects.isNull(file)){
            return "文件为空";
        }
        //创建对象存储的域名
        String endpoint = "oss-cn-beijing.aliyuncs.com";
        //验证码获取的accessKeyId
        String accessKeyId = "LTAI5tBRvj5w8YWdkFqnaBwq";
        //验证码获取的accessKeySecret
        String accessKeySecret ="mWFfLVEEqKfjzSKZzrBracln4Jv8Db";
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        //存储空间的名字
        String bucketName = "kong-9";


        //获取文件后缀名
        String originalFilename = file.getOriginalFilename();
        int i = originalFilename.lastIndexOf(".");
        String png = originalFilename.substring(i);
        //生成新的文件名 brand/：在bucketName里面创建的分组
        String fileName ="myFile/" + UUID.randomUUID().toString().substring(0, 4) + png;
        //文件访问地址。
        String url = "https://" +bucketName+ ".oss-cn-beijing.aliyuncs.com" + "/" + fileName;
        // 上传文件到指定的存储空间（bucketName）并将其保存为指定的文件名称（fileName）。
        try {
            ossClient.putObject(bucketName, fileName, file.getInputStream());

        } catch (IOException e) {
            e.printStackTrace();
        }
        // 关闭OSSClient。
        ossClient.shutdown();
        return url;
    }



//    @PostMapping("/upload")
//    @DbLog(operation = "文件",type = LogType.ADD)
//    public Result upload(MultipartFile file)  {
//        if(file.isEmpty()){
//            return Result.error("401","文件不能为空");
//        }
//        ObjectMetadata meta = new ObjectMetadata();
//        // 指定上传的内容类型。
//        meta.setContentType("text/plain");
//
//        // 通过UploadFileRequest设置多个参数。
//        // 依次填写Bucket名称（例如examplebucket）以及Object完整路径（例如exampledir/exampleobject.txt），Object完整路径中不能包含Bucket名称。
//        UploadFileRequest uploadFileRequest = new UploadFileRequest("kong-9",file.);
//
//        // 通过UploadFileRequest设置单个参数。
//        // 填写本地文件的完整路径，例如D:\\localpath\\examplefile.txt。如果未指定本地路径，则默认从示例程序所属项目对应本地路径中上传文件。
//        uploadFileRequest.setUploadFile(file.getName());
//        // 指定上传并发线程数，默认值为1。
//        uploadFileRequest.setTaskNum(5);
//        // 指定上传的分片大小，单位为字节，取值范围为100 KB~5 GB。默认值为100 KB。
//        uploadFileRequest.setPartSize(1 * 1024 * 1024);
//        // 开启断点续传，默认关闭。
//        uploadFileRequest.setEnableCheckpoint(true);
//        // 记录本地分片上传结果的文件。上传过程中的进度信息会保存在该文件中，如果某一分片上传失败，再次上传时会根据文件中记录的点继续上传。上传完成后，该文件会被删除。
//        // 如果未设置该值，默认与待上传的本地文件同路径，名称为${uploadFile}.ucp。
//        uploadFileRequest.setCheckpointFile("yourCheckpointFile");
//        // 文件的元数据。
//        uploadFileRequest.setObjectMetadata(meta);
//        // 设置上传回调，参数为Callback类型。
//        //uploadFileRequest.setCallback("yourCallbackEvent");
//
//        // 断点续传上传。
//        try {
//            ossClient.uploadFile(uploadFileRequest);
//        } catch (Throwable throwable) {
//            throwable.printStackTrace();
//        }
//
//        return null;
//    }

//    @GetMapping("/download/{fileName}")
//    public void download(@PathVariable String fileName) throws Exception {
//
//        // 填写Bucket名称，例如examplebucket。
//        String bucketName = "kong-9";
//        // 填写不包含Bucket名称在内的Object完整路径，例如testfolder/exampleobject.txt。
//        String objectName = "myFile/"+fileName;
//        String rootPath = "D:\\localpath\\";
//        // 如果当前文件的父级目录不存在，就创建
//        if (!FileUtil.exist(rootPath)) {
//            FileUtil.mkdir(rootPath);
//        }
//        String pathName = rootPath+fileName;
//
//        try {
//            // 下载Object到本地文件，并保存到指定的本地路径中。如果指定的本地文件存在会覆盖，不存在则新建。
//            // 如果未指定本地路径，则下载后的文件默认保存到示例程序所属项目对应本地路径中。
//            ossClient.getObject(new GetObjectRequest(bucketName, objectName), new File(pathName));
//        } catch (OSSException oe) {
//            System.out.println("Caught an OSSException, which means your request made it to OSS, "
//                    + "but was rejected with an error response for some reason.");
//            System.out.println("Error Message:" + oe.getErrorMessage());
//            System.out.println("Error Code:" + oe.getErrorCode());
//            System.out.println("Request ID:" + oe.getRequestId());
//            System.out.println("Host ID:" + oe.getHostId());
//        } catch (ClientException ce) {
//            System.out.println("Caught an ClientException, which means the client encountered "
//                    + "a serious internal problem while trying to communicate with OSS, "
//                    + "such as not being able to access the network.");
//            System.out.println("Error Message:" + ce.getMessage());
//        } finally {
//            if (ossClient != null) {
//                ossClient.shutdown();
//            }
//        }
//    }
}

